iT邦幫忙

2026 iThome 鐵人賽

DAY 1
0

關於原生Java的Schedule - 1

  • 排程的重要性 ⭐⭐⭐
    • 在看Java原生排程之前,先來看看後端為何要有排程。
    • 1️⃣ 排程可以消化大量的耗時請求,以及重複的動作(Batch Processing),來保持主服務穩定。
    • 2️⃣ 排程可以 定期 清理垃圾資源,或者過期的Session、Token等等。而針對電商系統,更有金流對帳等資源上定期核對的需求。
  • 排程的問題 ⭐⭐⭐
    • 在併發下,要如何確保排程不會因多台伺服器導致重複執行(如重複發送折價券)。
    • 是否會有多排程同時爭奪資源的問題。
    • 資源訪問 --> 其沒有JWT的限制,因此需要注意權限的分配。
    • 資料庫的問題 --> 資源保護及撈資料須以Pagination作處理。
  • Timer vs. ScheduledExecutorService ⭐⭐⭐⭐
    • 在早期的Java中,Timer是主要的排程類別,但其有個硬傷 --> 單一執行緒。
    • 因此後來的JUC(java.util.concurrent)引入後,出現了ScheduledExecutorService(我後續簡稱SES好了w),解決了單一執行緒的問題。

    兩者的詳細比較

    • Timer由於只有 單一執行緒,因此處理排程任務會堆在一起。然而SES可以用 ThreadPool 作配置,因此可以分配多執行緒來處理多排程。
    • Timer無法處理Uncaught Exception,一旦排程出問題,整個執行緒就bye bye。然而SES的ThreadPool可以捕捉異常,其他排程可繼續工作。
    • Timer取消任務的機制十分笨重,且不支援任務的回傳。然而SES支援 Callable,且排程啟動後的回傳物件即為 ScheduleFuture,因此可以利用 .cancel.get 來取消、取得任務結果。

本篇文章出自《每天學Java直到今年結束》Day216,大家可以到我的網站上查看~


系列文
Java Spring專案的兩大元件 - Security、Schedule1
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言